package middleware

import (
	"GoControalBackend/pkg/log"
	"github.com/gin-gonic/gin"
	"github.com/sirupsen/logrus"
	"io/ioutil"
	"time"
)

// Logger 日志中间件
func Logger() gin.HandlerFunc {
	// 获取日志记录器
	logger := log.Log()
	return func(context *gin.Context) {
		// 开始时间
		startTime := time.Now()
		// 处理请求
		context.Next()
		// 结束时间
		endTime := time.Now()
		// 执行时间
		latencyTime := endTime.Sub(startTime) / time.Millisecond
		// 请求方式
		requestMethod := context.Request.Method
		// 请求路由
		requestUrl := context.Request.RequestURI
		// 请求头
		header := context.Request.Header
		// 协议版本
		proto := context.Request.Proto
		// 状态码
		statusCode := context.Writer.Status()
		// 请求API
		clientIP := context.ClientIP()
		// 获取请求处理中的错误
		err := context.Err()
		// 读取请求体
		body, _ := ioutil.ReadAll(context.Request.Body)
		// 记录日志
		logger.WithFields(logrus.Fields{
			"status_code":    statusCode,
			"latency_time":   latencyTime,
			"client_ip":      clientIP,
			"request_method": requestMethod,
			"request_url":    requestUrl,
			"header":         header,
			"proto":          proto,
			"err":            err,
			"body":           body,
		}).Info()
	}
}
